#ifndef VPropEditor_H
#define VPropEditor_H

///////////////////////////////////////////////////////////////////////////////

class VProp : public QObject
{
	Q_OBJECT

public:
	VProp();
	~VProp();

	void setName(const QString &v) { m_name = v;}
	QString name() const { return m_name;}

	void setText(const QString &v) { m_text = v;}
	QString text() const { return m_text;}
	
	void setObject(const QObject *v) { m_object = (QObject*)v;}
	QObject *object() const { return m_object;}
	
	virtual QWidget *editor() const = 0;
	
private:
	QString m_text;
	QString m_name;
	QObject *m_object;
};															

typedef QSharedPointer<VProp> VPropPtr;

///////////////////////////////////////////////////////////////////////////////

class VPropEditor : public QFrame
{
	Q_OBJECT
	
public:
	VPropEditor(QWidget *parent = NULL);
	~VPropEditor();

	void addProp(VProp *prop);
	
signals:
	void propChanged(VProp *prop);

private:
	QVBoxLayout *m_layout;
	QList<VPropPtr> m_props;
};

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

class VPropEnum : public VProp
{
	Q_OBJECT

public:
	VPropEnum();
	~VPropEnum();
	
	void setEnumNames(const QStringList &v) { m_editor->addItems(v);}
	
	void setValue(int v);
	int value() const { return m_editor->currentIndex();}

	virtual QWidget *editor() const { return m_editor;}
	
signals:
	void valueChanged(int &v);

private slots:	
	void currentIndexChanged(int index) { setValue(index);}

private:
	QComboBox *m_editor;
};															

///////////////////////////////////////////////////////////////////////////////

class VPropString : public VProp
{
	Q_OBJECT

public:
	VPropString();
	~VPropString();

	void setValue(const QString &v);
	QString value() const { return m_editor->text();}

	virtual QWidget *editor() const { return m_editor;}
	
signals:
	void valueChanged(QString &v);

private slots:	
	void textChanged(const QString &text) { setValue(text);}

private:
	QLineEdit *m_editor;
};															

///////////////////////////////////////////////////////////////////////////////

class VPropInteger : public VProp
{
	Q_OBJECT

public:
	VPropInteger();
	~VPropInteger();

	void setValue(int v);
	int value() const { return m_editor->text().toInt();}

	virtual QWidget *editor() const { return m_editor;}

signals:
	void valueChanged(int &v);

private slots:	
	void textChanged(const QString &text) { setValue(text.toInt());}

private:
	QLineEdit *m_editor;
};															

///////////////////////////////////////////////////////////////////////////////

#endif
